﻿#include <iostream>     // 引入标准输入输出流头文件，用于输出日志到控制台
#include <sqlite3.h>    // 引入 SQLite3 的头文件，提供数据库操作的函数声明
int main() {
    sqlite3* db;        // 定义一个 SQLite 数据库指针，用于表示数据库连接
    char* errMsg = nullptr; // 用于接收 SQLite 返回的错误信息（需要手动释放）
    // 1. 打开或创建数据库文件（如果 test.db 不存在则会自动创建）
    if (sqlite3_open("test.db", &db) != SQLITE_OK) { // 调用 sqlite3_open 打开数据库
        std::cerr << "no open sqlite: " << sqlite3_errmsg(db) << std::endl; // 打开失败时输出错误信息
        return 1; // 返回 1 表示程序异常退出
    }
    std::cout << "conn sucess" << std::endl; // 输出连接成功信息
    // 2. 创建表（如果不存在则新建）
    const char* createTableSQL =
            "CREATE TABLE IF NOT EXISTS users (" // 创建表 users，如果已存在则不重复创建
            "id INTEGER PRIMARY KEY AUTOINCREMENT, " // id 列，自增主键
            "name TEXT, " // name 列，存储字符串
            "age INTEGER);"; // age 列，存储整数
    if (sqlite3_exec(db, createTableSQL, 0, 0, &errMsg) != SQLITE_OK) { // 执行 SQL 语句
        std::cerr << "create table fail: " << errMsg << std::endl; // 输出错误信息
        sqlite3_free(errMsg); // 释放错误信息内存
    }
    // 3. 插入数据
    const char* insertSQL = "INSERT INTO users (name, age) VALUES ('Alice', 25);"; // 插入一条数据
    if (sqlite3_exec(db, insertSQL, 0, 0, &errMsg) != SQLITE_OK) { // 执行 SQL 插入语句
        std::cerr << "insert into fail: " << errMsg << std::endl; // 输出错误信息
        sqlite3_free(errMsg); // 释放错误信息内存
    }
    // 4. 查询数据
    auto callback = [](void*, int argc, char** argv, char** colName) -> int { // 定义回调函数，用于处理查询结果
        for (int i = 0; i < argc; i++) { // argc 表示列数，argv 存放每列的值
            std::cout << colName[i] << ": " << (argv[i] ? argv[i] : "NULL") << " | "; // 输出列名与对应的值
        }
        std::cout << "\n"; // 换行
        return 0; // 返回 0 表示正常处理
    };
    const char* selectSQL = "SELECT * FROM users;"; // 查询 users 表的所有数据
    if (sqlite3_exec(db, selectSQL, callback, 0, &errMsg) != SQLITE_OK) { // 执行 SQL 查询语句
        std::cerr << "search failed: " << errMsg << std::endl; // 输出错误信息
        sqlite3_free(errMsg); // 释放错误信息内存
    }
    // 输出查询的所有的用户信息
    // 5. 更新数据
    const char* updateSQL = "UPDATE users SET age = 30 WHERE name = 'Alice';"; // 更新 Alice 的年龄为 30
    sqlite3_exec(db, updateSQL, 0, 0, &errMsg); // 执行更新操作
    // 6. 删除数据
    //const char* deleteSQL = "DELETE FROM users WHERE name = 'Alice';"; // 删除名字为 Alice 的记录
    //sqlite3_exec(db, deleteSQL, 0, 0, &errMsg); // 执行删除操作
    // 7. 关闭数据库
    sqlite3_close(db); // 关闭数据库连接
    return 0; // 返回 0 表示程序正常结束
}
